table of contents
SIGNAL(2) | Linux - příručka Programátora | SIGNAL(2) |
JMÉNO¶
signal - práce se signály v ANSI C
SYNTAXE¶
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler);
POPIS¶
Chování volání signal() se liší napříč distribucemi Unixu a také se liší historicky v jednotlivých vydáních Linuxu. Vyhněte se použití této funkce. Raději použijte sigaction(2). Viz přenositelnost níže.
Systémové volání signal
instaluje novou obslužnou funkci pro
signál s číslem signum. Obsluha signálu je
nastavena na handler, což může být
uživatelsky definovaná funkce nebo SIG_IGN
případně SIG_DFL.
Pokud je signál signum přijat procesem, stane se jedna z následujících věcí:
- *
- Je-li nastaveno SIG_IGN signál je ignorován.
- *
- Je-li nastaveno SIG_DFL je vyvolána implicitní funkce.
- *
- Pokud je dispozice nastavena na funkci, pak je nejdřív buď znovu nastavena dispozice na SIG_DFL nebo je signál blokován(viz přenositelnost níže) a obslužná funkce je volána s parametrem signum. Pokud volání funkce zablokovalo signál, je signál odblokován při návratu z obslužné funkce.
Signály SIGKILL a SIGSTOP nemohou být odchyceny nebo blokovány.
Obslužná funkce dostane při zavolání jako parametr číslo signálu. To umožňuje použít jednu obslužnou funkci pro více signálů.
NÁVRATOVÁ HODNOTA¶
Funkce signal vrací předchozí hodnotu obsluhy signálu, nebo SIG_ERR , nastane-li chyba.
CHYBY¶
EINVAL signum je neplatný
SPLŇUJE STANDARDY¶
C89, C99, POSIX.1-2001.
POZNÁMKY¶
Efekt funkce signal v procesech s vlákny nejsou specifikovány.
Dle specifikace POSIX je chování systému nespecifikováno, pokud ignoruje SIGFPE , SIGILL nebo SIGSEGV signál pokud nebyl vyvolán pomocí kill (2) nebo raise (3). Celočíselné dělení nulou má nedefinovaný výsledek. Na některých architekturách se generuje SIGFRE signál. (Také dělení největšího záporného celého čísla -1 generuje SIGFRE). Ignorování tohoto signálu může vést k nekonečné smyčce.
Viz sigaction(2) pro více informací co se stane je-li SIGCHLD nastaveno na SIG_IGN.
Viz signal(7) pro seznam asynchronních bezpečných funkcí, které mohou být bezpečně volány uvnitř funkce pro obsluhu signálu.
Použití sighandler_t je rozšířením GNU. Různé verze glibc předem definují tento typ; libc4 a libc5 definují SignalHandler, glibc definuje sig_t a je-li definován _GNU_SOURCE pak je definován i sighandler_t. Bez definice takového typu je deklarace funkce signal hůře čitelná.
void ( * signal(int signum, void (* handler)(int)) ) (int);
Přenositelnost¶
Jediné přenositelné použití funkce signal() je nastavit obsluhu signálu na SIG_DFL nebo SIG_IGN. Sémantika použití signal() na nastavení obsluhy signálu se liší na různých systémech (a POSIX.1 tot explicitně podporuje). Proto jej nepoužívejte za tímto účelem.
POSIX.1 vyřešil tento nesoulad v přenositelnosti zavedením sigaction(2), který poskytuje explicitní kontrolu sémantiky v případě vyvolání obsluhy signálu. Používejte jej proto místo signal()u.
Pokud v původních Unixových systémech byla obslužná funkce zřízená pomocí signal() vyvolána pomocí doručení signálu, stav byl nastaven na SIG_DFL a systém neblokoval další možná doručení tohoto signálu. System V také poskytuje sémantiku pro signal(). To bylo špatné, protože signál mohl být znovu doručen před tím, než se mohla obsluha signálu obnovit. Navíc doručení několika signálu stejného druhu bezprostředně za sebou vyústilo v rekurzivní volání obsluhy signálu.
BSD vylepšilo tuto situaci změnou sémantiky obsluhy signálu (ale naneštěstí v tichosti také změnily sémantiku zřízení obsluhy pomocí signal()). Když je na BSD vyvolána obsluha signálu , tak není dispozice signálu znovu nastavena a další doručení signálu je blokováno dokud se provádí obsluha.
Situace na Linuxu je následující:
- *
- Systémové volání jádra signal poskytuje System V sémantiku.
- *
- Implicitně v glibc 2 a pozdějších
vydáních je obalen signal() funkcí,
která nevolá jádro systému. Místo toho
volá sigaction(2) a používá
příznaky, které zaručí BSD
sémantiku. Toto chování ja zaručeno po dobu
trvání definice makra _BSD_SOURCE. Standartně
je _BSD_SOURCE definováno; je také implicitně
definováno, pokud je nadefinováno _GNU_SOURCE a
také může být definováno
explicitně.
Na glibc 2 a pozdějších, pokud není _BSD_SOURCE test makro definováno, poskytuje signal() sémantiku System V. (Standardní implicitní definice _BSD_SOURCE není poskytnuta, pokud je gcc(1) vyvoláno v jenom ze standardních módů (-std=xxx nebo -ansi) nebo je definováno jiné test makro jako například _POSIX_SOURCE, _XOPEN_SOURCE nebo _SVID_SOURCE viz feature_test_macros(7).)
- Funkce signal() v Linuxu libc4 a libc5 poskutyje sémantiku
- System V. Pokud je na libc5 systém vloženo <bsd/signal.h> místo <signal.h> pak poskytuje signal() BSD sémantiku.
DALŠÍ INFORMACE¶
kill(1), alarm(2)kill(2), killpg(2), pause(2), sigaction(2), signalfd(2),sigpending(2) sigprocmask(2), sigqueue(2), sigsuspend(2),bsd_signal(3) raise(3), siginterrupt(3), sigsetopts(3),sigvec(3) sysv_signal(3), feature_test_macros (7), signal (7).
TIRÁŽ¶
Tato stránka je součástí projektu Linux man-pages. Popis projektu a informace o hlášení chyb najdete na http://www.kernel.org/doc/man-pages/.
23.září 2009 | Linux 2.0 |